--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / recovery / memory_preflight.py
Displaying Raw • Download
meshchatx/src/backend/recovery/memory_preflight.py c0b0ddffd735a0d007c1be9a5e8563ec42fdafc0 (c0b0ddff) Text, 3.44 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Startup memory checks before heavy backend initialization."""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787psutil
Te6edf3MEMORY_LOG_PREFIX Tff7b72= Ta5d6ff"Ta5d6ffMESHCHAT_MEMORY:Ta5d6ff"
Te6edf3_ABORT_AVAILABLE_MB Tff7b72= T79c0ff150
Te6edf3_CRITICAL_WARN_AVAILABLE_MB Tff7b72= T79c0ff400
Te6edf3_WARN_AVAILABLE_MB Tff7b72= T79c0ff700
Te6edf3_LOW_TOTAL_MB Tff7b72= T79c0ff5120
Te6edf3_CRITICAL_WARN_PERCENT Tff7b72= T79c0ff90
Te6edf3_WARN_PERCENT Tff7b72= T79c0ff85
Tff7b72def Td2a8ffget_system_memory_snapshotTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4:
T8b949e"""Return host memory metrics in megabytes and percent used."""
Te6edf3mem Tff7b72= Te6edf3psutilTff7b72.Td2a8ffvirtual_memoryTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fftotal_mbTa5d6ff"Tb4b4b4: Te6edf3memTff7b72.Td2a8fftotal Tff7b72/ Tb4b4b4(T79c0ff1024Tff7b72*Tff7b72*T79c0ff2Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffavailable_mbTa5d6ff"Tb4b4b4: Te6edf3memTff7b72.Td2a8ffavailable Tff7b72/ Tb4b4b4(T79c0ff1024Tff7b72*Tff7b72*T79c0ff2Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffpercent_usedTa5d6ff"Tb4b4b4: Tffa657floatTb4b4b4(Te6edf3memTff7b72.Td2a8ffpercentTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffevaluate_startup_memoryTb4b4b4(Te6edf3emergencyTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4:
T8b949e"""Classify startup memory pressure and choose a guard action."""
Te6edf3snapshot Tff7b72= Te6edf3get_system_memory_snapshotTb4b4b4(Tb4b4b4)
Te6edf3available_mb Tff7b72= Te6edf3snapshotTb4b4b4[Ta5d6ff"Ta5d6ffavailable_mbTa5d6ff"Tb4b4b4]
Te6edf3total_mb Tff7b72= Te6edf3snapshotTb4b4b4[Ta5d6ff"Ta5d6fftotal_mbTa5d6ff"Tb4b4b4]
Te6edf3percent_used Tff7b72= Te6edf3snapshotTb4b4b4[Ta5d6ff"Ta5d6ffpercent_usedTa5d6ff"Tb4b4b4]
Te6edf3action Tff7b72= Ta5d6ff"Ta5d6ffokTa5d6ff"
Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3available_mb Tff7b72< Te6edf3_ABORT_AVAILABLE_MBTb4b4b4:
Te6edf3action Tff7b72= Ta5d6ff"Ta5d6ffabortTa5d6ff"
Te6edf3message Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffAvailable memory is critically low Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(Tffd700{Te6edf3available_mbTffd700:Ta5d6ff.0fTffd700}Ta5d6ff MB). Close other apps or relaunch in Emergency Mode.Ta5d6ff"
Tb4b4b4)
Tff7b72elif Te6edf3available_mb Tff7b72< Te6edf3_CRITICAL_WARN_AVAILABLE_MB Tff7b72or Tb4b4b4(
Te6edf3total_mb Tff7b72<Tff7b72= Te6edf3_LOW_TOTAL_MB Tff7b72and Te6edf3percent_used Tff7b72>Tff7b72= Te6edf3_CRITICAL_WARN_PERCENT
Tb4b4b4)Tb4b4b4:
Te6edf3action Tff7b72= Ta5d6ff"Ta5d6ffwarnTa5d6ff"
Te6edf3message Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffLow system memory detected Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(Tffd700{Te6edf3available_mbTffd700:Ta5d6ff.0fTffd700}Ta5d6ff MB available). Emergency Mode is strongly recommended.Ta5d6ff"
Tb4b4b4)
Tff7b72elif Te6edf3available_mb Tff7b72< Te6edf3_WARN_AVAILABLE_MB Tff7b72or Tb4b4b4(
Te6edf3total_mb Tff7b72<Tff7b72= Te6edf3_LOW_TOTAL_MB Tff7b72and Te6edf3percent_used Tff7b72>Tff7b72= Te6edf3_WARN_PERCENT
Tb4b4b4)Tb4b4b4:
Te6edf3action Tff7b72= Ta5d6ff"Ta5d6ffwarnTa5d6ff"
Te6edf3message Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffSystem memory is limited Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ff(Tffd700{Te6edf3available_mbTffd700:Ta5d6ff.0fTffd700}Ta5d6ff MB available). Emergency Mode is recommended on 4 GB devices.Ta5d6ff"
Tb4b4b4)
Tff7b72return Tb4b4b4{
Tff7b72*Tff7b72*Te6edf3snapshotTb4b4b4,
Ta5d6ff"Ta5d6ffactionTa5d6ff"Tb4b4b4: Te6edf3actionTb4b4b4,
Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4: Te6edf3messageTb4b4b4,
Ta5d6ff"Ta5d6ffemergency_requestedTa5d6ff"Tb4b4b4: Te6edf3emergencyTb4b4b4,
Ta5d6ff"Ta5d6fflow_memoryTa5d6ff"Tb4b4b4: Te6edf3action Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffabortTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwarnTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffformat_memory_log_lineTb4b4b4(Te6edf3resultTb4b4b4: Tffa657dictTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Emit a single machine-readable startup memory line for Electron logs."""
Tff7b72return Tb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3MEMORY_LOG_PREFIXTffd700}Ta5d6ff total_mb=Tffd700{Te6edf3resultTb4b4b4[Ta5d6ff'Ta5d6fftotal_mbTa5d6ff'Tb4b4b4]Tffd700:Ta5d6ff.1fTffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffavailable_mb=Tffd700{Te6edf3resultTb4b4b4[Ta5d6ff'Ta5d6ffavailable_mbTa5d6ff'Tb4b4b4]Tffd700:Ta5d6ff.1fTffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffpercent_used=Tffd700{Te6edf3resultTb4b4b4[Ta5d6ff'Ta5d6ffpercent_usedTa5d6ff'Tb4b4b4]Tffd700:Ta5d6ff.1fTffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffaction=Tffd700{Te6edf3resultTb4b4b4[Ta5d6ff'Ta5d6ffactionTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff Ta5d6ff"
Ta5d6fffTa5d6ff"Ta5d6ffemergency=Tffd700{Tffa657strTb4b4b4(Te6edf3resultTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffemergency_requestedTa5d6ff'Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"
Tb4b4b4)
Tff7b72def Td2a8ffparse_memory_log_lineTb4b4b4(Te6edf3textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dict Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Parse a MESHCHAT_MEMORY startup line from captured backend output."""
Tff7b72if Tff7b72not Te6edf3textTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72for Te6edf3raw_line Tff7b72in Te6edf3textTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3line Tff7b72= Te6edf3raw_lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3MEMORY_LOG_PREFIXTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3payload Tff7b72= Te6edf3lineTb4b4b4[Tffa657lenTb4b4b4(Te6edf3MEMORY_LOG_PREFIXTb4b4b4) Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Te6edf3parsedTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657str Tff7b72| Tffa657float Tff7b72| Tffa657boolTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3token Tff7b72in Te6edf3payloadTff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ff=Ta5d6ff" Tff7b72not Tff7b72in Te6edf3tokenTb4b4b4:
Tff7b72continue
Te6edf3keyTb4b4b4, Te6edf3value Tff7b72= Te6edf3tokenTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff=Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3key Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6fftotal_mbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffavailable_mbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpercent_usedTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3parsedTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Tffa657floatTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72elif Te6edf3key Tff7b72== Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4:
Te6edf3parsedTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3parsedTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3value
Tff7b72return Te6edf3parsed Tff7b72or Tff7b72None
Tff7b72return Tff7b72None
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────